package com.liuguangzhou.controller;

import com.liuguangzhou.SpringBootEmailStart;
import com.liuguangzhou.model.User;
import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.io.FileSystemResource;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.thymeleaf.TemplateEngine;
import org.thymeleaf.context.Context;

import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;
import java.io.File;
import java.io.IOException;
import java.io.StringWriter;
import java.util.Date;

/**
 * @ClassName SendSimpleMail
 * @Description: TODO
 * @Author liuguangzhou
 * @Date 2020/3/21
 * @Version V1.0
 **/

@Controller
public class SendMail {
    @Autowired
    public JavaMailSender javaMailSender;

    @Autowired
    public TemplateEngine templateEngine;

    @RequestMapping("/SendSimpleMail")
    @ResponseBody
    //发送简单邮件 简单邮件就是指邮件内容是一个普通的文本文档：
    public void SendSimpleMail(){
        SimpleMailMessage message = new SimpleMailMessage();
        message.setSubject("这是一封测试邮件");
        message.setFrom("842252480@qq.com");
        message.setTo("samuel.liu@analyticservice.net");
        message.setCc("meliuguangzhou@163.com");
        message.setBcc("meliuguangzhou@163.com");
        message.setSentDate(new Date());
        message.setText("这是测试邮件的正文2");
        javaMailSender.send(message);
    }


    @RequestMapping("sendAttachFileMail")
    @ResponseBody
    //发送带附件的邮件
    //邮件的附件可以是图片，也可以是普通文件，都是支持的。
    public void sendAttachFileMail(){
        MimeMessage mimeMessage=javaMailSender.createMimeMessage();

        try {
            MimeMessageHelper helper = new MimeMessageHelper(mimeMessage,true);
            helper.setSubject("这是一封测试邮件");
            helper.setFrom("842252480@qq.com");
            helper.setTo("samuel.liu@analyticservice.net");
            helper.setCc("meliuguangzhou@163.com");
            helper.setBcc("meliuguangzhou@163.com");
            helper.setSentDate(new Date());
            helper.setText("这是测试邮件的正文");
            helper.addAttachment("我讲完了.jpg",new File("C:\\Users\\AAS\\Pictures\\123.gif"));
            javaMailSender.send(mimeMessage);
        } catch (MessagingException e) {
            e.printStackTrace();
        }
    }

    @RequestMapping("sendImgResMail")
    @ResponseBody
    //发送带图片资源的邮件
    //图片资源和附件有什么区别呢？图片资源是放在邮件正文中的，即一打开邮件，就能看到图片。
    // 但是一般来说，不建议使用这种方式，一些公司会对邮件内容的大小有限制（因为这种方式是将图片一起发送的）。
    public void sendImgResMail() throws MessagingException {
        MimeMessage mimeMessage = javaMailSender.createMimeMessage();
        MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true);
        helper.setSubject("这是一封测试邮件");
        helper.setFrom("842252480@qq.com");
        helper.setTo("samuel.liu@analyticservice.net");
        helper.setCc("meliuguangzhou@163.com");
        helper.setBcc("meliuguangzhou@163.com");
        helper.setSentDate(new Date());
        helper.setText("<p>hello 大家好，这是一封测试邮件，这封邮件包含两种图片，分别如下</p><p>第一张图片：</p><img src='cid:p01'/><p>第二张图片：</p><img src='cid:p02'/>",true);
        helper.addInline("p01",new FileSystemResource(new File("C:\\Users\\AAS\\Pictures\\123.gif")));
        helper.addInline("p02",new FileSystemResource(new File("C:\\Users\\AAS\\Pictures\\qwe.png")));
        javaMailSender.send(mimeMessage);
    }



    @RequestMapping("sendFreemarkerMail")
    @ResponseBody

    //在公司实际开发中，第一种和第三种都不是使用最多的邮件发送方案。
    // 因为正常来说，邮件的内容都是比较的丰富的，所以大部分邮件都是通过 HTML 来呈现的，
    // 如果直接拼接 HTML 字符串，这样以后不好维护，为了解决这个问题，一般邮件发送，都会有相应的邮件模板。
    // 最具代表性的两个模板就是 Freemarker 模板和 Thyemeleaf 模板了。
    public void sendFreemarkerMail() throws MessagingException, IOException, TemplateException {
        MimeMessage mimeMessage = javaMailSender.createMimeMessage();
        MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true);
        helper.setSubject("这是一封测试邮件");
        helper.setFrom("842252480@qq.com");
        helper.setTo("samuel.liu@analyticservice.net");
        helper.setCc("meliuguangzhou@163.com");
        helper.setBcc("meliuguangzhou@163.com");
        helper.setSentDate(new Date());
        //构建 Freemarker 的基本配置
        Configuration configuration = new Configuration(Configuration.VERSION_2_3_0);
        // 配置模板位置
        ClassLoader loader = SpringBootEmailStart.class.getClassLoader();
        configuration.setClassLoaderForTemplateLoading(loader, "templates");
        //加载模板
        Template template = configuration.getTemplate("mail.ftl");
        User user = new User();
        user.setUsername("javaboy");
        user.setNum(1);
        user.setSalary((double) 99999);
        StringWriter out = new StringWriter();
        //模板渲染，渲染的结果将被保存到 out 中 ，将out 中的 html 字符串发送即可
        template.process(user, out);
        helper.setText(out.toString(),true);
        javaMailSender.send(mimeMessage);
    }



    @RequestMapping("sendThymeleafMail")
    @ResponseBody
    public void sendThymeleafMail() throws MessagingException {
        MimeMessage mimeMessage = javaMailSender.createMimeMessage();
        MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true);
        helper.setSubject("这是一封测试邮件");
        helper.setFrom("842252480@qq.com");
        helper.setTo("samuel.liu@analyticservice.net");
        helper.setCc("meliuguangzhou@163.com");
        helper.setBcc("meliuguangzhou@163.com");
        helper.setSentDate(new Date());
        Context context = new Context();
        context.setVariable("username", "javaboy");
        context.setVariable("num","000001");
        context.setVariable("salary", "99999");
        String process =templateEngine.process("mail.html", context);
        helper.setText(process,true);
        javaMailSender.send(mimeMessage);
    }
}
